package nsga.population;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import abstractGA.GAParameter;
import abstractGA.chrom.Chrom;
import abstractGA.popu.PopuBuilder;
import abstractGA.popu.Population;
import algorithm.AlgCtx;
import nsga.chromosome.NSRulSeqGAChrom;

/**
 * 不带学习机制多目标NSRulSeqGA的种群构建器
 * @author ls
 *
 */
public class NSRulSeqGAPopuBuilder extends PopuBuilder {
	//算法参数
		protected GAParameter parameter = null;
		// 随机数类
		protected Random rnd = null;
		// 染色体集合
		protected List<Chrom> chroms = null;
		// 种群
		protected Population popu = null;
		
		public NSRulSeqGAPopuBuilder() {
			//产生NSGA的种群
			popu = new NSRulSeqGAPopu();
		}
		
		@Override
		/**
		 * 构造不带学习机制的NSGA染色体集合
		 * @param algCtx:算法运行上下文
		 */
		public void buildChroms(AlgCtx algCtx) {
			chroms = new ArrayList<Chrom>();
			int size = parameter.getPopuSize();
			for (int i = 0; i < size; i++) {
				/*
				 * 注意这里构造的染色体是不带学习机制的NSRulSeqGA染色体
				 */
				Chrom chrom = new NSRulSeqGAChrom(algCtx,parameter);
				chroms.add(chrom);
			}
			popu.setChroms(chroms);

		}

		@Override
		/**
		 * 构造参数对象
		 * @param algCtx:算法运行上下文
		 */
		public void buildPara(AlgCtx algCtx) {
			parameter = new GAParameter(algCtx.getAlgCfgFileName());
			popu.setParameter(parameter);
		}

		@Override
		//获取构造好的种群
		public Population getPopu() {
			return popu;
		}

		@Override
		//构造随机数对象
		public void buildRandom() {
			rnd=new Random();
			popu.setRandom(rnd);
		}
}
